昨天已經看到了 if 的各種型態轉換。有時候我們真的需要伸手去整理這些條件,Rider 也提供很多便捷的小技巧,可以最大幅度地減少我們手動修改條件判斷的機會。
沿用昨天的例子,這次我不用 Invert If,而是從另一個方向來整理。
按下 Show Context Actions,選擇 Merge Two 'if's。
可以看到兩層的 if 被壓縮成一層了。
再做一次。雖然循環複雜度沒有減少,但減少了兩層的巢狀結構,對可理解性來說還是幫助非常大。
還是有點習慣 Early Return 的寫法,再做一次 Invert If。
即使我早就忘記什麼是 De Morgan's Laws 也沒關係,Rider 會幫我把 if 整理地好好的。
中午吃飯前 PM 跑來跟我說,沒付錢的訂單不能算 Failed,要算 Pending。這個目標跟現在這個寫法有點遠,我打算先把它整理成適合修正的形狀。選取 Flip '||' Operands。
如此就把 IsPaid 的判斷調換位置,搬到最後面了。
接著這次選擇 Split Into Two 'if' Statements。
這樣就把不同情境的條件拆開了。
現在的寫法要調整邏輯就很簡單。
細心的人會注意到,Rider 並不是所有操作都符合重構「不改變行為」的定義。Rider 會特別將這類的操作標示為「會改變語意」 (chage semantics)。
一如昨天所說,條件式的修改往往是 bug 發生的地方,非到不得已是不會手動修改的。而即使 Rider 提供很多方便的操作,遇到一些比較複雜的情況,我甚至會畫真值表來驗算。當然,如果條件允許的話最好還是補個測試,即使我們知道怎麼做安全重構,也難保下一個修改的同事會不會又把它改壞。咦,我怎麼說又?